package com.example.thread.base.demo2;

/**
 * @author LiYuhang
 * @version 0.1
 * @application
 * @Date 2020/8/14 10:40
 */

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 底层：返回ThreadPoolExecutor实例，corePoolSize为0；maximumPoolSize为Integer.MAX_VALUE；keepAliveTime为60L；unit为TimeUnit.SECONDS；
 * workQueue为SynchronousQueue(同步队列)
 * 通俗：当有新任务到来，则插入到SynchronousQueue中，由于SynchronousQueue是同步队列，因此会在池中寻找可用线程来执行，若有可以线程则执行，
 * 若没有可用线程则创建一个线程来执行该任务；若池中线程空闲时间超过指定大小，则该线程会被销毁。
 * 适用：执行很多短期异步的小程序或者负载较轻的服务器
 */
@Slf4j(topic = "CacheThreadPool")
public class CacheThreadPool {


    /**
     * 1.创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程，那么就会回收部分空闲（60秒不执行任务）的线程
     * 2.当任务数增加时，此线程池又可以智能的添加新线程来处理任务<br>
     * 3.此线程池不会对线程池大小做限制，线程池大小完全依赖于操作系统（或者说JVM）能够创建的最大线程大小<br>
     */
    public static void cacheThreadPool(Integer limit) {

        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < limit; i++) {
            try {
                Thread.sleep(limit * 1);
            } catch (InterruptedException e) {
                log.error("InterruptedException",e);
            }
            int finalI = i;
            cachedThreadPool.execute(() -> log.info("线程名称：{}，执行{}",Thread.currentThread().getName(),finalI));
        }
        cachedThreadPool.shutdown();
    }
}
